<?php
/**@brief Classe controladora responsavel pelas ações do usuário Administrador
 *
 *
 * Classe controladora responsavel pelas ações do usuário Administrador.
 * Cada metodo deste correponde a uma view na pasta 'view\admin'
 *
 * \param Observação importante: o dado "$this->data" corresponde aos dados
 * passados via metodo post, usados nos formulários de cadastro
 * no view de cada ação.
 */
class AdminController extends AppController{
 ///Define o template usado pelo usuário logado
    public $layout = "layout_admin";
    ///Declara as classes usadas, no caso os Models que serão usados para persistencia.
    public $uses = array("Users","Disciplina","Turma","Diario");

 /**
     * Metodo responsavel pela inicialização do template do admin.
     */
    function index(){        
        
    }


    /**
     * Metodo responsável pela criação de uma nova disciplina, recebendo seus dados
     * pelo objeto $data.
     */
  
    function novaDisciplina(){
        if($this->data){
            if($this->Disciplina->validate($this->data)){
                $this->Disciplina->save($this->data);
                $this->set("resultadoCadastro", "Disciplina Cadastrada com Sucesso!");
            }
            else
            {
                $this->set("erro", $this->Disciplina->errors);
            }
        }        
    }

    /**
     * Exibe as disciplinas e envia para o view
     */
    function listarDisciplinas(){
        $disciplinas= $this->Disciplina->all();
        $this->set("disciplinas",$disciplinas );
    }

    /**
     * Metodo para buscar disciplinas
     */
    function buscarDisciplina(){

    }

    /**
     * Busca detalhes da disciplina selecionada e envia para o view
     */
    function detalhesDisciplina($id = null){
        if($this->data){
                $disciplina=$this->Disciplina->first(array("conditions" => array("id" => $this->data["id"])));
                $this->set("disciplina",$disciplina );
            }
        else if($id){
            $disciplina=$this->Disciplina->first(array("conditions" => array("id" => $id)));
            $this->set("disciplina",$disciplina );
        }
    }

    /**
     * Metodo para excluir a disciplina selecionada
     */
    function excluirDisciplina($id= null, $confirmacao = false){
        if($confirmacao){
            $resultado = $this->Disciplina->delete($id);
            if($resultado)
                $this->set("resultadoExclusao", "Disciplina excluída com sucesso!");
            else
                $this->set("resultadoExclusao", "Não foi possível excluir a disciplina!");
        }
        else{
            if($this->Disciplina->exists($id)){
                $disciplina = $this->Disciplina->first(array(
                    "conditions" => array("id" => $id),
                    "recursion"  => "2"
                    ));
                $this->set("disciplina", $disciplina );
                if(isset($disciplina["turma"]))
                    $this->set("dependentes", $disciplina["turma"]);                
            }
            else{
               $this->set("erro", "A Disciplina ".$id." não existe");
            }
        }
        $this->set("confirmacao", $confirmacao);
    }


    /**
     * Adiciona um novo professor, recebendo seus dados pelo objeto $data
     */
    function novoProfessor(){
        if($this->data){
            if($this->Users->validate($this->data))
            {
                $this->Users->save($this->data);
                $this->set("resultadoCadastro", "Professor Cadastrado com Sucesso!");
            }
            else
            {
                $this->set("erro", $this->Users->errors);
            }
        }
    }

    /**
     * Busca todos os professores e envia para o view
     */
    function listarProfessores(){
        $professores= $this->Users->all(array(
            "conditions" => array( "nivel" => "professor")
        ));
        $this->set("professores",$professores );
    }

    /**
     * Buscar professor
     */
    function buscarProfessor(){
    }

    /**
     * Exibe detalhes do professor e envia para o view
     */
    function detalhesProfessor($id = null){
        if($this->data){
                $professor=$this->Users->first(array("conditions" => array("username" => $this->data["username"])));
                $this->set("professor",$professor );
            }
        else if($id){
            $professor=$this->Users->first(array("conditions" => array("id" => $id)));
            $this->set("professor",$professor );
        }
    }

    /**
     * Metodo para excluir professor
     */
    function excluirProfessor($id= null, $confirmacao = false){
        if($confirmacao){
            $resultado = $this->Users->delete($id);
            if($resultado)
                $this->set("resultadoExclusao", "Professor excluído com sucesso!");
            else
                $this->set("resultadoExclusao", "Não foi possível excluir o professor!");
        }
        else{
            if($this->Users->exists($id)){
                $professor = $this->Users->first(array(
                    "conditions" => array("id" => $id),
                    "recursion"  => "1"
                    ));
                $this->set("professor", $professor );
                if(isset($professor["turma"]))
                    $this->set("dependentes", $professor["turma"]);
            }
            else{
               $this->set("erro", "O Professor não existe");
            }
        }
        $this->set("confirmacao", $confirmacao);
    }

    
    /**
     * Metodo para inserir um novo aluno, com os dados passados pelo objeto $data
     */
    function novoAluno(){
        if($this->data){
            if($this->Users->validate($this->data))
            {
                $this->Users->save($this->data);
                $this->set("resultadoCadastro", "Aluno Cadastrado com Sucesso!");
            }
            else
            {
                $this->set("erro", $this->Users->errors);
            }
        }
    }

/**
 * Metodo para listar todos os alunos do sistema, passando para o view o resultado
 */
    function listarAlunos(){
        $alunos= $this->Users->all(array(
            "conditions" => array( "nivel" => "aluno")
        ));
        $this->set("alunos",$alunos );
    }

    /**
     * Metodo para buscar um aluno
     */
    function buscarAluno(){
    }

    /**
     * Metodo para exibir todos os detalhes do aluno, passando para o view o resultado
     */
    function detalhesAluno($id = null){
        if($this->data){
                $aluno=$this->Users->first(array("conditions" => array("username" => $this->data["username"])));
                $this->set("aluno",$aluno );
            }
        else if($id){
            $aluno=$this->Users->first(array("conditions" => array("id" => $id)));
            $this->set("aluno",$aluno );
        }
    }

    /**
     * Metodo para excluir o aluno
     */
    function excluirAluno($id= null, $confirmacao = false){
        if($confirmacao){
            $resultado = $this->Users->delete($id);
            if($resultado)
                $this->set("resultadoExclusao", "Aluno excluído com sucesso!");
            else
                $this->set("resultadoExclusao", "Não foi possível excluir o aluno");
        }
        else{
            if($this->Users->exists($id)){
                $aluno = $this->Users->first(array(
                    "conditions" => array("id" => $id)
                    ));
                $this->set("aluno", $aluno );
            }
            else{
               $this->set("erro", "O Aluno não existe");
            }
        }
        $this->set("confirmacao", $confirmacao);
    }

    /**
     * Metodo para inserir um aluno em uma turma
     */
    function inserirTurma(){
        if($this->data)
        {
            $this->set("confirmacao", true);
            $turmas= array();
            $aluno=$this->Users->first(array("conditions" => array("username" => $this->data["username"])));
            unset($this->data["username"]);
            foreach ($this->data as $turmasSerializadas)
            {
                $turmas[]= unserialize($turmasSerializadas);
            }
            $this->set("aluno",$aluno );
            $this->set("turmas",$turmas );
            $this->set("confirmacao", true);
        }
        else
        {
            $disciplinas = $this->Disciplina->all(array("recursion"  => "2"));
            $disciplinasTurma= array();
            foreach ($disciplinas as $disciplina)
            {
                $turma = $disciplina["turma"];
                if(count($turma) > 0)
                {
                    $disciplinasTurma[]=$disciplina;
                }
            }
            $this->set("disciplinas",$disciplinasTurma );
            $this->set("confirmacao", false);

        }
       

    }
    /**
     * Continuação do metodo inserirTurma, gravando o diario de classe
     */
    function resultadoInserirTurma(){
        if($this->data)
        {
            $turmas=unserialize($this->data["turmas"]);
            foreach ($turmas as $turma)
            {
                $result=$this->Diario->save(array(
                    "disciplina_id" => $turma["disciplina_id"],
                    "turma_id"      => $turma["id"],
                    "users_id"      => $this->data["id_aluno"]
                ));
            }
            if($result)
            {
               $this->set("resultado","Matricula feita com sucesso!" );
            }
            else
            {
               $this->set("resultado","Erro em Matricula!" );
            }
            
        }


    }


    /**
     * Criação de uma nova turma no sistema
     */
    function novaTurma(){
        $disciplinas= $this->Disciplina->all();
        $this->set("disciplinas",$disciplinas );

        $professores= $this->Users->all(array("conditions" => array( "nivel" => "professor")));
        $this->set("professores",$professores );
        
        if($this->data){
            if($this->Turma->validate($this->data))
            {
                $this->Turma->save($this->data);
                $this->set("resultadoCadastro", "Turma Cadastrada com Sucesso!");
            }
            else
            {
                 $this->set("erro", $this->Turma->errors);
            }
        }
    }
    /**
     * Metodo para buscar uma turma especifica
     */
    function buscarTurma(){
    }

/**
 *Exibe detalhes da turma selecionada
 */
    function detalhesTurma($disciplina_id = null, $id = null){
        if($this->data){
                $turma=$this->Turma->first(array("conditions" => array("id" => $this->data["id"],"disciplina_id" => $this->data["disciplina_id"])));
                $this->set("turma",$turma );
            }
        else if($id && $disciplina_id)
        {
            $turma=$this->Turma->first(array("conditions" => array("id" => $id, "disciplina_id" => $disciplina_id)));
            $this->set("turma",$turma );
        }
        
    }
/**
 * Lista todas as turmas do sistema.
 */
    function listarTurmas(){
        $turmas= $this->Turma->all();
        $this->set("turmas",$turmas );
    }

/**
 *Excluir turma do sistema. Necessário verificar dependencias com outras classes.
 */
    function excluirTurma($disciplina_id = null, $id = null, $confirmacao = false){
        if($confirmacao){
            $resultado = $this->Turma->delete($disciplina_id, $id);
            if($resultado)
                $this->set("resultadoExclusao", "Turma excluída com sucesso!");
            else
                $this->set("resultadoExclusao", "Não foi possível excluir a turma!");
        }
        else{
            if($this->Turma->exists($disciplina_id,$id))
            {
                $turma = $this->Turma->first(array("conditions" => array("disciplina_id" => $disciplina_id,
                                                                         "id"            => $id
                                                                        )
                                                  )
                                            );
                $this->set("turma", $turma );
            }
            else{
               $this->set("erro", "A Turma não existe");
            }
        }
        $this->set("confirmacao", $confirmacao);
    }
/**
 * Exibe todos os alunos matriculados em uma turma especifica.
 */
    function listarAlunoTurma()
    {
        if($this->data)
        {
                $diarios=$this->Diario->all(array("conditions" => array("turma_id" => $this->data["turma_id"],"disciplina_id" => $this->data["disciplina_id"]),"recursion" =>"-1"));
                $turma=$this->Turma->first(array("conditions" => array("id" => $this->data["turma_id"],"disciplina_id" => $this->data["disciplina_id"]),"recursion" =>"-1"));
                $disciplina =$this->Disciplina->first(array("conditions" => array("id" => $this->data["disciplina_id"]),"recursion" =>"-1"));
                $dd = array();
                foreach ($diarios as $diario)
                {
                    $user=$this->Users->first(array("conditions" => array("id" => $diario["users_id"]),"recursion" =>"-1"));
                    $d= array_merge($diario,array("users"=>$user,"turma"=>$turma,"disciplina"=>$disciplina));
                    $dd[]=$d;
                }
                $this->set("diarios",$dd );
                $this->set("confirmacao",true );
            }
            else
            {
            $this->set("confirmacao",false );
        }
        
        
    }

/**
 *Metodo para excluir um aluno da turma especifica.
 */
    function excluirAlunoTurma($disciplina_id = null ,$turma_id =null ,$users_id = null, $confirmacao = false)
    {
        if($confirmacao)
        {
            $resultado = $this->Diario->delete($disciplina_id, $turma_id, $users_id);
            if($resultado)
                $this->set("resultadoExclusao", "Aluno excluído da turma com sucesso!");
            else
                $this->set("resultadoExclusao", "Não foi possível excluir o aluno da turma!");
        }
        else
        {
            if($this->Diario->exists($disciplina_id ,$turma_id, $users_id))
            {
                $aluno = $this->Users->first(array("conditions" => array("id" => $users_id)));
                $this->set("aluno", $aluno );
                $turma=$this->Turma->first(array("conditions" => array("id" => $turma_id,"disciplina_id" => $disciplina_id)));
                $this->set("turma",$turma );

            }
            else{
               $this->set("erro", "Não existe esse aluno inserido nessa turma");
            }
        }
        $this->set("confirmacao", $confirmacao);
    }

/**
 * Metodo para resetar o sistema, apagando as turmas criadas.
 */
    function novoSemestre($confirmacao = false)
    {
        if($confirmacao)
        {
            $turmas = $this->Turma->all(array("fields" => array("disciplina_id", "id"),"recursion" =>"-1"));
            foreach ($turmas as $turma)
            {
                $resultado= $this->Turma->delete($turma["disciplina_id"], $turma["id"]);
            }
            if($resultado)
                $this->set("resultadoExclusao", "O Semestre foi reinicializado!");
            else
                $this->set("resultadoExclusao", "Erro na exclusão!");
        }
        $this->set("confirmacao", $confirmacao);
        
    }
    
}

?>